/*
*    Qizx/open 3.0 beta
*
* This code is the open-source version of Qizx.
* Copyright (C) 2004-2009 Axyana Software -- All rights reserved.
*
* The contents of this file are subject to the Mozilla Public License 
*  Version 1.1 (the "License"); you may not use this file except in 
*  compliance with the License. You may obtain a copy of the License at
*  http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
*  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
*  for the specific language governing rights and limitations under the
*  License.
*
* The Initial Developer of the Original Code is Xavier Franc - Axyana Software.
*
*/
using System;
namespace System.Qizx.Util.IO
{
	
	/// <summary>  Output to a list of byte blocks.
	/// May be configured to work with a single block.
	/// </summary>
	[Serializable]
	public class CoreByteOutput:ByteOutputBase
	{
		internal sbyte[][] blocks;
		internal int[] blockSizes;
		internal int blockCount;
		
		public CoreByteOutput():base(8192)
		{
			blocks = new sbyte[8][];
			blockSizes = new int[blocks.Length];
		}
		
		/// <summary> Single block output (error if overflow).</summary>
		public CoreByteOutput(sbyte[] data):base(data)
		{
			blocks = null;
		}
		
		protected internal override void  writeBuffer(sbyte[] buffer, int size)
		{
			if (blocks == null)
				return ;
			
			if (blockCount >= blocks.Length)
			{
				sbyte[][] old = blocks;
				blocks = new sbyte[old.Length * 2][];
				Array.Copy(old, 0, blocks, 0, old.Length);
				int[] oldSizes = blockSizes;
				blockSizes = new int[blocks.Length];
				Array.Copy(oldSizes, 0, blockSizes, 0, oldSizes.Length);
			}
			blockSizes[blockCount] = size;
			sbyte[] buf = new sbyte[size];
			Array.Copy(data, 0, buf, 0, size);
			blocks[blockCount++] = buf;
		}
		
		public override void  close()
		{
			if (bufPtr > 0)
				flushBuffer();
			bufPtr = 0;
		}
	}
}